package io.mft.commons.db.mapper.proxyinvoker.invoker;

import java.lang.reflect.Method;

import cn.hutool.db.Entity;
import cn.hutool.db.Session;
import cn.hutool.db.handler.EntityHandler;
import io.mft.commons.db.DbUtil;
import io.mft.commons.db.ISQLParameter;
import io.mft.commons.db.SQL;
import io.mft.commons.db.mapper.Pager;
import io.mft.commons.db.mapper.builder.ParameterWrapper;
import io.mft.commons.db.mapper.proxyinvoker.IProxyInvoker;
import io.mft.commons.function.response.kv.KVMap;
import io.mft.commons.function.response.kv.PageObject;
public class DBPageProxyInvoker implements IProxyInvoker<PageObject<KVMap>> {

	@Override
	public PageObject<KVMap> invoke(Method method, Session session, ISQLParameter sqlParameter, KVMap parameter,ParameterWrapper methodArgs) throws Exception{
		PagerProxyInvoker invoker=new PagerProxyInvoker();
		Pager pager=invoker.invoke(method, session, sqlParameter, parameter, methodArgs);
		SQL sql = sqlParameter.sqlText(parameter);
		String countSql=DbUtil.buildCountSQL(sql.getSql());
		Entity countEntity=session.query(countSql,new EntityHandler(true),sql.getArgs());
		int total=countEntity.getInt("total");
		PageObject<KVMap> pageObject=new PageObject<>(pager.getCurrentPage(), pager.getNumPerPage(), total);
		pageObject.getList().addAll(pager.getDataList());
		return pageObject;
	}
	
}
